/**
 * In questo modo mi sottoscrivo all'evento 'localizzaSuMappa'
 * 
 *   var subscriptionLocalizza = events.subscribe('localizzaSuMappa', function(obj) {
 *       alert(obj);
 *   });
 *   
 *   Al click invio a tutte le finestre la funzione associata a 'localizzaSuMappa', a cui invio un nome, un oggetto, nome dello sharedworker (in questo caso uno solo) che non fa altro che memorizzare tutti gli utilizzatori dello shared worker
 *   
 *   <button onclick="events.broadcast('localizzaSuMappa', '',myWorker)">Localizza tutto</button>
 */

var events = (function(){
  var topics = {};
  var hOP = topics.hasOwnProperty;

  return {
    subscribe: function(topic, listener) {
      /**
       * Create the topic's object if not yet created
       */
      if(!hOP.call(topics, topic)) topics[topic] = [];

      /**
       * Add the listener to queue
       */
      var index = topics[topic].push(listener) -1;

      /**
       * Provide handle back for removal of topic
       */
      return {
        remove: function() {
          delete topics[topic][index];
        }
      };
    },
    publish: function(topic, info) {
      /**
       * If the topic doesn't exist, or there's no listeners in queue, just leave
       */
      if(!hOP.call(topics, topic)) return;

      /**
       * Cycle through topics queue, fire!
       */
      topics[topic].forEach(function(item) {
      		item(info != undefined ? info : {});
      });
    },
    broadcast: function(topic, info, myWorker) {
    	var payload = {};
	    	payload.tp = topic;
	    	payload.inf = info;
	    	
	    myWorker.port.postMessage(payload);
    }
  };
})();
